package com.learning.platform.service;

import com.learning.platform.util.CaptchaUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * 验证码服务类
 */
@Service
public class CaptchaService {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    private static final long CAPTCHA_EXPIRATION = 5; // 验证码过期时间（分钟）
    
    /**
     * 生成验证码并存储到Redis
     * @return 验证码key
     * @throws Exception 异常
     */
    public String generateCaptcha() throws Exception {
        // 生成验证码
        String code = CaptchaUtil.generateCode();
        
        // 生成唯一的key
        String key = UUID.randomUUID().toString();
        
        // 存储到Redis，设置过期时间
        redisTemplate.opsForValue().set(key, code, CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
        
        return key;
    }
    
    /**
     * 验证用户输入的验证码
     * @param key 验证码key
     * @param userInput 用户输入的验证码
     * @return 验证结果
     */
    public boolean validateCaptcha(String key, String userInput) {
        // 从Redis中获取存储的验证码
        Object storedCodeObj = redisTemplate.opsForValue().get(key);
        
        if (storedCodeObj == null) {
            return false; // 验证码不存在或已过期
        }
        
        String storedCode = storedCodeObj.toString();
        
        // 不区分大小写比较
        return storedCode.equalsIgnoreCase(userInput);
    }
    
    /**
     * 生成验证码图片
     * @param key 验证码key
     * @return Base64编码的验证码图片
     * @throws Exception 异常
     */
    public String generateCaptchaImage(String key) throws Exception {
        // 从Redis中获取存储的验证码
        Object storedCodeObj = redisTemplate.opsForValue().get(key);
        
        if (storedCodeObj == null) {
            throw new Exception("验证码不存在或已过期");
        }
        
        String code = storedCodeObj.toString();
        
        // 生成验证码图片
        return CaptchaUtil.generateCaptchaImage(code);
    }
}